<?php
namespace app\admin\controller;
/**
 * #角色管理#{角色管理控制器}
 */
class Role extends Common{
	/**
	 * #角色管理#
	 * @return view
	 */
    function index(){
        $list=model($this->table)->readAll([],true);
		$this->assign('list',$list);
		$nodes=model('node')->getNodes();       
		$this->assign('nodes',json_encode($nodes));
        $navs=model('navs')->getNavs('admin');
        $this->assign('navs',json_encode($navs));
        $members=model('member')->readAll([],0,['field'=>'id,name']);
        $this->assign('members',$members);
        return view();
    }
    /**
     * #添加、编辑角色#
     * @param integer $id 角色ID
     */
    function add($id=0){
        $user=$this->user;
        $role=[];
        if($id>0){
            $role=model($this->table)->read(['id'=>$id]);
            //该项不存在 做添加操作
            if(empty($role)){
                $id=0;
            }
        }
        if(request()->isPost()){
            $data=[
                'id'=>$id,
                'name'=>input('name/s',''),
                'status'=>input('status/d',1),
                'remark'=>input('remark/s',''),
            ];
            $has=$this->hasName($data['name'],$id);
            if($has){
                $this->error('已存在该角色名称');
            }
            $operation=[];
            if($id>0){
                $operation=model($this->table)->edit($data);
            }else{
                $operation=model($this->table)->add($data);
            }
            if(empty($operation)){
                $this->error(lang('Failed operation'));
            }
            $this->success(lang('Successful operation'));
        }
    }
    /**
     * #删除角色#
     * @param  integer $id 角色ID
     * @param  array   $ids 角色ID组
     * @return json
     */
    function del($id=0){
        if(request()->isAjax()||request()->isPost()){
            $ids=input('ids/a',[]); // 多项删除
            if($id<=0&&empty($ids)){
                $this->error(lang('Data does not exist'));
            }
            $where=['id'=>$id];
            $_map=['role_id'=>$id];
            if(!empty($ids)){
                $where=[
                    'id'=>['id','in',$ids]
                ];
                $_map=[
                    'role_id'=>['role_id','in',$ids]
                ];
            }
            
            $del=model($this->table)->del($where);
            if($del){
                // 删除其余的角色关联信息
                model('role_member')->del($_map); //会员
                model('role_navs')->del($_map); //菜单
                model('role_node')->del($_map); //权限节点
                $this->success(lang('Successful operation'));
                die;
            }
            $this->error(lang('Failed operation'));
        }
    }
    /**
     * #禁用、启用角色#
     * @param  integer $id 角色ID
     * @param  array   $ids 角色ID组
     * @return json
     */
    function close($id=0){
        if(request()->isAjax()||request()->isPost()){
            $ids=input('ids/a',[]); // 多项
            if($id<=0&&empty($ids)){
                $this->error(lang('Data does not exist'));
            }
            $where="";
            if(!empty($ids)){
                $ids=implode(',', $ids);
                $where.=" `id` in ({$ids}) ";
            }else{
                $where.=" `id`={$id} ";
            }
            $rs=model($this->table)->close($where,'status',true);
            if($rs){
                $this->success(lang('Successful operation'));
                die;
            }
            $this->error(lang('Failed operation'));
        }
    }
    /**
     * #分配权限#{给角色分配权限}
     * @param  array  $diff 发生变化的权限ID组
     * @param  integer  $role_id 角色ID
     * @return json
     */
    function grant($diff=[],$role_id=0){
    	if(request()->isAjax()||request()->isPost){
    		if(empty($diff)||$role_id<=0){
    			$this->error(lang('Data does not exist'));
    		}
    		$has=model($this->table)->read(['id'=>$role_id],'id');
    		if(!count($has)){
    			$this->error('不存在该角色');
    		}
    		$isRemove=model('role_node')->where(['role_id'=>$role_id,'node_id'=>$diff[0]])->count();
    		if($isRemove){
                $where=[
                    'role_id'=>$role_id,
                    'node_id'=>['node_id','in',$diff]
                ];
    			$del=model('role_node')->del($where);
    			if($del){
    				$this->success('移除成功');
    				die;
    			}
    			$this->error('移除失败');
    		}else{
                $data=[];
                foreach($diff as $v) {
                    $data[]=['role_id'=>$role_id,'node_id'=>$v];
                }
    			$add=model('role_node')->add($data);
    			if(count($add)){
    				$this->success('添加成功');
    				die;
    			}
    			$this->error('添加失败');
    			
    		}
    	}
    }
    /**
     * #菜单分配#{给角色分配菜单}
     * @param  array  $diff 发生变化的菜单ID组
     * @param  string  $module 所属模块
     * @param  integer  $role_id 角色ID
     * @return json
     */
    function grantNavs($diff=[],$module=null,$role_id=0){
        if(request()->isAjax()||request()->isPost){
            if(empty($diff)||is_null($module)||$role_id<=0){
                $this->error(lang('Data does not exist'));
            }
            $has=model($this->table)->read(['id'=>$role_id],'id');
            if(!count($has)){
                $this->error('不存在该角色');
            }
            $isRemove=model('role_navs')->where(['role_id'=>$role_id,'navs_id'=>$diff[0]])->count();
            if($isRemove){
                $where=[
                    'role_id'=>$role_id,
                    'module'=>$module,
                    'navs_id'=>['navs_id','in',$diff]
                ];
                $del=model('role_navs')->del($where);
                if($del){
                    $this->success('移除成功');
                    die;
                }
                $this->error('移除失败');
            }else{
                $data=[];
                foreach($diff as $v) {
                    $data[]=['role_id'=>$role_id,'navs_id'=>$v,'module'=>$module];
                }
                $add=model('role_navs')->add($data);
                if(count($add)){
                    $this->success('添加成功');
                    die;
                }
                $this->error('添加失败');
                
            }
        }
    }
    /**
     * #默认角色#{默认的角色即为新用户注册即赋予该角色}
     * @param  integer  $id 角色ID
     * @return json
     */
    function setDefaultRole($id=0){
        if(request()->isAjax()||request()->isPost){
            if($id<=0){
                $this->error(lang('Data does not exist'));
            }
            $has=model($this->table)->read(['id'=>$id],'id');
            if(!count($has)){
                $this->error('不存在该角色');
            }
            $set=model($this->table)->close("id=$id",'is_default',true);
            if($set){
                $this->success(lang('Successful operation'));
                die;
            }
            $this->error(lang('Failed operation'));
        }
    }
    /**
     * #分配会员#{角色管理中给每个角色分配会员}
     * @param  array  $diff 发生变化的会员ID组
     * @param  integer  $role_id 角色ID
     * @return json
     */
    function grantMember($diff=[],$role_id=0){
        if(request()->isAjax()||request()->isPost){
            if(empty($diff)||$role_id<=0){
                $this->error(lang('Data does not exist'));
            }
            $has=model($this->table)->read(['id'=>$role_id],'id');
            if(!count($has)){
                $this->error('不存在该角色');
            }
            $isRemove=model('role_member')->where(['role_id'=>$role_id,'member_id'=>$diff[0]])->count();
            if($isRemove){
                $where=[
                    'role_id'=>$role_id,
                    'member_id'=>['member_id','in',$diff]
                ];
                $del=model('role_member')->del($where);
                if($del){
                    $this->success('移除成功');
                    die;
                }
                $this->error('移除失败');
            }else{
                $data=[];
                foreach($diff as $v) {
                    $data[]=['role_id'=>$role_id,'member_id'=>$v];
                }
                $add=model('role_member')->add($data);
                if(count($add)){
                    $this->success('添加成功');
                    die;
                }
                $this->error('添加失败');
                
            }
        }
    }
    /**
     * 获取角色的会员
     * @param  integer $id 角色ID
     * @return json
     */
    function getMemberIds($id=0){
        if(request()->isAjax()||request()->isPost()){
            $ids=model($this->table)->getMemberIds($id);
            $this->success(lang('Successful operation'),'',$ids);
        }
    }
    /**
     * 获取角色的权限
     * @param  integer $id 角色ID
     * @return json
     */
    function getNodeIds($id=0){
    	if(request()->isAjax()||request()->isPost()){
	    	$ids=model($this->table)->getNodeIds($id);
    		$this->success(lang('Successful operation'),'',$ids);
    	}
    }
    /**
     * 用户选择不同的模块菜单
     * @param  string $val 模块名称
     * @return json
     */
    function getNavs($val='admin'){
        if(request()->isAjax()||request()->isPost()){
            $navs=model('navs')->getNavs($val);
            $this->success(lang('Successful operation'),'',$navs);
        }
    }
    /**
     * 获取角色的菜单
     * @param  integer $id 角色ID
     * @return json
     */
    function getNavsKeys($id=0,$module='admin'){
        if(request()->isAjax()||request()->isPost()){
            $ids=model($this->table)->getNavsIds($id,['module'=>$module]);
            $this->success(lang('Successful operation'),'',$ids);
        }
    }
    // 验证名称是否重复
    private function hasName($name='',$id=0){
        if(empty($name)){
            return true;
        }
        $where=[
            'name'=>$name,
        ];
        if($id>0){
            $where['id']=['id','neq',$id];
        }
        $has=model($this->table)->read($where);
        if($has){
            return true;
        }
    }
}